import unittest
import requests
import sys
import os
from time import sleep
from parameterized import parameterized
# 加入项目根路径
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
# 确保 tools.py 在根目录中
from api import log
from tools import read_json
from api.api_register_login import ApiRegisterLogin

class Test01RegisterLogin(unittest.TestCase):
    #初始化
    def setUp(self) -> None:
        #获取参数对象
        self.session = requests.session()
        log.info("正在初始化session对象:{}".format(self.session))
        #获取apiregisterlogin实例
        self.reg = ApiRegisterLogin(self.session)
        
    #结束
    def tearDown(self) -> None:
        #关闭参数对象
        log.info("正在关闭session对象:{}".format(self.session))
        self.session.close()
    #1.获取图片验证码测试

    @parameterized.expand(read_json("register_login.json", "img_code"))
    def test01_img_code(self,random, except_code):
        try:

            #1.调用图片验证码接口
            r = self.reg.api_img_code(random)
            log.info("获取图片验证码状态码:{}".format(r.status_code))
            #2.查看状态码
            self.assertEqual(r.status_code, except_code)
            log.info("执行图片验证码断言通过")
        except Exception as e:
            #查看日志
            log.error("获取图片验证码失败:{}".format(e))
            #抛出异常
            raise
       
    #2.获取短信验证码测试
    @parameterized.expand(read_json("register_login.json", "phone_code"))
    def test02_phone_code(self, phone = "13600001111", imgVerifyCode = "8888", except_text = "发送成功"):
        try:
            #1.调用短信验证码接口
            self.reg.api_img_code(123)
            #2.调用短信验证码接口
            r = self.reg.api_phone_code(phone = phone, imgVerifyCode=imgVerifyCode)
            log.info("获取短信验证码接口结果:{}".format(r.text))
            #3.查看响应结果
            self.assertIn(except_text, r.text)
            log.info("执行短信验证码断言通过")
        except Exception as e:
            #查看日志
            log.error("获取短信验证码失败:{}".format(e))
            #抛出异常
            raise

  
    #3注册测试 
    @parameterized.expand(read_json("register_login.json", "register"))
    def test03_register(self, phone, password ,verifycode,phone_code, except_text): #实际上需要清数据，已没有数据库权限，知道即可，这里用已存在代替注册成功断言
        try:
            #1.图片验证码接口
            self.reg.api_img_code(123)
            #2.短信验证码接口
            self.reg.api_phone_code(phone = phone, verifycode=verifycode) 
            #3.注册接口
            r = self.reg.api_register(phone= phone, password = password, verifycode=verifycode, phone_code = phone_code)
            log.info("获取注册接口结果:{}".format(r.text))
            #4. 查看响应结果 
            self.assertIn(except_text, r.text)
            log.info("执行注册断言通过")
        except  Exception as e:
            #查看日志
            log.error("注册失败:{}".format(e))
            #抛出异常
            raise



    #4.登录测试 
    @parameterized.expand(read_json("register_login.json", "login"))
    def test04_login(self, keywords, password, except_text):
        try:
            i = 0 #注意循环次数
            r = None
            if "error" in password: #error为测试锁定数据，只有在测试锁定时才会使用
                while i < 3:
                    r = self.reg.api_login(keywords, password)  # 获取图片验证码
                    log.info("获取登录接口结果:{}".format(r.text))
                    i += 1
                print("测试锁定", r.text)
                self.assertIn("锁定", r.text)
                log.info("执行注册断言通过")
                #暂停60秒
                sleep(60)
                #测试登录成功
                r = self.reg.api_login(keywords = "13600001111", password = "test123")
                log.info("获取登录接口结果:{}".format(r.text))
                self.assertIn(except_text, r.text)
            else:
                #1. 调用登录接口
                r = self.reg.api_login(keywords = keywords, password = password)
                #2. 查看结果
                print(r.json())
                self.assertIn(except_text, r.text)
                log.info("执行登录断言通过")
        except Exception as e:
            #查看日志
            log.error("登录失败:{}".format(e))
            #抛出异常
            raise

    #5.查询登录状态测试
    @parameterized.expand(read_json("register_login.json", "login_status"))
    def test03_login_status(self,status , except_text):
        try:
            if status == "已登录":
            
                #1. 调用登录接口
                self.reg.api_login(keywords = "13600001111", password = "test123")
            #2. 查询登录状态接口
            r = self.reg.api_login_status()
            log.info("获取查询登录状态接口结果:{}".format(r.text))
                #3.查看结果
            self.assertIn(except_text, r.text)
            log.info("执行登录断言通过")
        except Exception as e:
            #查看日志
            log.error("登录失败:{}".format(e))
            #抛出异常
            raise

if __name__ == "__main__":
    # 执行测试
    unittest.main()